// backend\app.js
const Koa = require("koa");
const app = new Koa();
const views = require("koa-views");
const json = require("koa-json");
const onerror = require("koa-onerror");
const bodyparser = require("koa-bodyparser");
// 引入我们封装好的日志文件
const myLog = require("./utils/myLog");
// 引入封装好的工具函数
const util = require("./utils/util");
const users = require("./routes/users");
const leave = require("./routes/leave");
const cors = require("koa2-cors");
// 引入koa-jwt
const koajwt = require("koa-jwt");
// error handler
onerror(app);
// 配置cors, 服务器支持跨域
app.use(
	cors({
		origin: "*",
	})
);
// middlewares
app.use(
	bodyparser({
		enableTypes: ["json", "form", "text"],
	})
);
app.use(json());
app.use(require("koa-static")(__dirname + "/public"));
app.use(
	views(__dirname + "/views", {
		extension: "pug",
	})
);
// logger
app.use(async (ctx, next) => {
	switch (ctx.method.toLowerCase()) {
		case "get":
			myLog.info(`get 请求, params: ${JSON.stringify(ctx.request.query)}`);
			break;
		case "post":
			myLog.info(`post 请求, params: ${JSON.stringify(ctx.request.body)}`);
			break;
	}
	// 如果token验证失败, 会抛出异常, 可以添加catch(), 来捕获处理异常
	await next().catch((err) => {
		// 如果状态码是401
		if (err.status === 401) {
			// 接口是通的, 所以是200
			ctx.status = 200;
			// 返回的具体信息和错误码
			// 错误信息, 可以是err里面信息进行拼接的结果
			ctx.body = util.fail("token 验证失败!", util.CODE.AUTH_ERROR);
		}
	});
});
// 在打印日志之后, 开始token拦截, 验证
// 参数是一个对象, secret是当时生成token时的秘钥
app.use(
	koajwt({ secret: "wangshidai" }).unless({
		// 不校验的url, 格式是正则
		path: [/^\/users\/login/],
	})
);
// routes
app.use(users.routes(), users.allowedMethods());
app.use(leave.routes(), leave.allowedMethods());
// error-handling
app.on("error", (err, ctx) => {
	console.error("server error", err, ctx);
});
module.exports = app;
